package com.zoulj.util;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class Convert {

    //---------------------------------- 时间相关转换 ---------------------------------------//

    /**
     * utc时间转北京时间
     * @param utc 2021-06-25T18:54:14.000Z
     * @return
     */
    public static String toDateStr(String utc) throws Exception{
        return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(ZonedDateTime.parse(utc).toLocalDateTime().plusHours(8));
    }

    /**
     * 任意类型 → String
     * 注：传入null将返回null
     *
     * @param whatever 任意类型数据，如日期、数字、集合、数组、异常等
     * @return str
     */
    public static String toStr(Object whatever) {
        if (null == whatever) {
            return null;
        }
        if (whatever instanceof Date) {
            // 日期，按标准格式进行格式化
            return toStr((Date) whatever, "yyyy-MM-dd HH:mm:ss");
        }
        if (whatever.getClass().isArray()) {
            // 数组
            return Arrays.deepToString((Object[]) whatever);
        }
        if (whatever instanceof Throwable) {
            // 异常
            StringWriter sw = new StringWriter();
            try (PrintWriter pw = new PrintWriter(sw)) {
                ((Throwable) whatever).printStackTrace(pw);
                return sw.toString();
            }
        }
        //Number、Collection、Map、8大基本类型及其包装类等
        return String.valueOf(whatever);
    }

    /**
     * Date → 指定格式的字符串
     *
     * @param date   日期（此处也可以传Timestamp）
     * @param format 格式，如"yyyy-MM-dd HH:mm:ss"，注意大小写
     * @return str
     */
    public static String toStr(Date date, String format) {
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 字符串 → TimeStamp，按照默认格式："yyyy-MM-dd HH:mm:ss"
     * <p>
     * 指定日期格式请使用：
     *
     * @param str 日期字符串
     * @return TimeStamp
     * @see Convert#toTimeStamp(String, String)
     */
    public static Timestamp toTimeStamp(String str) throws ParseException {
        return toTimeStamp(str, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 字符串 → TimeStamp，按照指定格式
     *
     * @param str    日期字符串
     * @param format 日期格式，如"yyyy-MM-dd HH:mm:ss"
     * @return TimeStamp
     */
    public static Timestamp toTimeStamp(String str, String format) throws ParseException {
        try {
            return new Timestamp(new SimpleDateFormat(format).parse(str).getTime());
        } catch (ParseException e) {
            throw new ParseException("转换TimeStamp失败，源字符串：" + str + "，解析格式：" + format, e.getErrorOffset());
        }
    }


    //---------------------------------- ResultSet相关转换 ---------------------------------------//

    /**
     * ResultSet → Map[String, String]
     * 适用于sql查询结果一定只有一条时（如果有多条记录，也只会取第一条）
     * <p>
     * 注意：结果集中的所有值都会被转换成String
     *
     * @param rs ResultSet
     * @return
     * @throws SQLException
     */
    public static Map<String, String> toMap(ResultSet rs) throws SQLException {
        if (!rs.next()) {
            return null;
        }
        ResultSetMetaData md = rs.getMetaData();
        int columnCount = md.getColumnCount();
        Map<String, String> rowData = new HashMap<>(columnCount);
        for (int i = 1; i <= columnCount; i++) {
            rowData.put(md.getColumnName(i), rs.getString(i));
        }
        return rowData;
    }


}
